R paketleri
Neden paketler var


Paketleri nereden bulabiliriz
Kendi paket evrenini oluştur
R paket yükleme
install.packages("tidyverse", dependencies = TRUE)
install.packages("jmv", dependencies = TRUE)
install.packages("questionr", dependencies = TRUE)
install.packages("Rcmdr", dependencies = TRUE)
install.packages("summarytools")
# install.packages("tidyverse", dependencies = TRUE)
# install.packages("jmv", dependencies = TRUE)
# install.packages("questionr", dependencies = TRUE)
# install.packages("Rcmdr", dependencies = TRUE)
# install.packages("summarytools")
Paket çağırma
# require(tidyverse)
# require(jmv)
# require(questionr)
# library(summarytools)
# library(gganimate)
Veriyi görüntüleme
Veriyi görüntüleme
# library(nycflights13)
# summary(flights)
View(data)
data
head
tail
glimpse
str
skimr::skim()
Veriyi değiştirme
Veriyi kod ile değiştirelim
Veriyi eklentilerle değiştirme
Basit tanımlayıcı istatistikler
summary()
mean
median
min
max
sd
table()
library(readr)
irisdata <- read_csv("data/iris.csv")
jmv::descriptives(
data = irisdata,
vars = "Sepal.Length",
splitBy = "Species",
freq = TRUE,
hist = TRUE,
dens = TRUE,
bar = TRUE,
box = TRUE,
violin = TRUE,
dot = TRUE,
mode = TRUE,
sum = TRUE,
sd = TRUE,
variance = TRUE,
range = TRUE,
se = TRUE,
skew = TRUE,
kurt = TRUE,
quart = TRUE,
pcEqGr = TRUE)
# install.packages("scatr")
scatr::scat(
data = irisdata,
x = "Sepal.Length",
y = "Sepal.Width",
group = "Species",
marg = "dens",
line = "linear",
se = TRUE)
DataExplorer
library(DataExplorer)
DataExplorer::create_report(df)

Grafikler
# library(ggplot2)
# library(mosaic)
# mPlot(irisdata)
descr(tobacco, style = 'rmarkdown')
print(descr(tobacco), method = 'render', table.classes = 'st-small')
dfSummary(tobacco, style = 'grid', plain.ascii = FALSE)
print(dfSummary(tobacco, graph.magnif = 0.75), method = 'render')
A beginner kit for #rstats The Landscape of R Packages for Automated Exploratory Data Analysis https://journal.r-project.org/archive/2019/RJ-2019-033/
@article{RJ-2019-033, author = {Mateusz Staniak and Przemysław Biecek}, title = {{The Landscape of R Packages for Automated Exploratory Data Analysis}}, year = {2019}, journal = {{The R Journal}}, doi = {10.32614/RJ-2019-033}, url = {https://journal.r-project.org/archive/2019/RJ-2019-033/index.html} }

Sonraki Konular
- RStudio ile GitHub kullanımı
- R Markdown ve R Notebook ile tekrarlanabilir rapor
- Hipotez testleri
Libraries Used
citation("tidyverse")
citation("foreign")
citation("tidylog")
citation("janitor")
citation("jmv")
citation("tangram")
citation("finalfit")
citation("summarytools")
citation("ggstatplot")
citation("readxl")
İletişim
Completed on 2019-11-08 19:35:45.
Serdar Balci, MD, Pathologist
drserdarbalci@gmail.com
https://rpubs.com/sbalci/CV
https://sbalci.github.io/
https://github.com/sbalci
https://twitter.com/serdarbalci
CommitMessage <- paste("updated on ", Sys.time(), sep = "")
wd <- getwd()
gitCommand <- paste("cd ", wd, " \n git add . \n git commit --message '", CommitMessage, "' \n git push origin master \n", sep = "")
system(command = gitCommand, intern = TRUE
)
LS0tCnRpdGxlOiBSIGlsZSBhbmFsaXplIGJhxZ9sYXJrZW5eW0J1IGJpciBkZXJsZW1lZGlyLCBtw7xta8O8biBtZXJ0ZWJlIGFsxLFudMSxbGFyYSByZWZlcmFucwogIHZlcm1leWUgw6dhbMSxxZ90xLFtLl0KYXV0aG9yOiAiRGVybGV5ZW4gW1NlcmRhciBCYWxjxLEsIE1ELCBQYXRob2xvZ2lzdF0oaHR0cHM6Ly9zYmFsY2kuZ2l0aHViLmlvLykiCmluc3RpdHV0ZTogIltzZXJkYXJiYWxjaS5jb21dKGh0dHBzOi8vd3d3LnNlcmRhcmJhbGNpLmNvbSkiCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSlgIgpvdXRwdXQ6CiAgeGFyaW5nYW46Om1vb25fcmVhZGVyOgogICAgbGliX2RpcjogbGlicwogICAgbmF0dXJlOgogICAgICBiZWZvcmVJbml0OiBbIm1hY3Jvcy5qcyIsICJodHRwczovL3BsYXRmb3JtLnR3aXR0ZXIuY29tL3dpZGdldHMuanMiXQogICAgICBoaWdobGlnaHRTdHlsZTogZ2l0aHViCiAgICAgIGhpZ2hsaWdodExpbmVzOiB0cnVlCiAgICAgIGNvdW50SW5jcmVtZW50YWxTbGlkZXM6IGZhbHNlCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQogIHJldmVhbGpzOjpyZXZlYWxqc19wcmVzZW50YXRpb246CiAgaHRtbF9ub3RlYm9vazoKICAgIGZpZ19jYXB0aW9uOiB5ZXMKICAgIGhpZ2hsaWdodDoga2F0ZQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIHRoZW1lOiBmbGF0bHkKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDUKICAgIHRvY19mbG9hdDogeWVzCiAgcGRmX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogJzUnCiAgaHRtbF9kb2N1bWVudDoKICAgIGZpZ19jYXB0aW9uOiB5ZXMKICAgIGtlZXBfbWQ6IHllcwogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogNQogICAgdG9jX2Zsb2F0OiB5ZXMKZWRpdG9yX29wdGlvbnM6IAogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUKLS0tCgo8IS0tIE9wZW4gYWxsIGxpbmtzIGluIG5ldyB0YWItLT4gIAo8YmFzZSB0YXJnZXQ9Il9ibGFuayIvPiAgIAoKPCEtLSBHbyB0byB3d3cuYWRkdGhpcy5jb20vZGFzaGJvYXJkIHRvIGN1c3RvbWl6ZSB5b3VyIHRvb2xzIC0tPiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvL3M3LmFkZHRoaXMuY29tL2pzLzMwMC9hZGR0aGlzX3dpZGdldC5qcyNwdWJpZD1yYS01YmMzNjkwMGE0MDUwOTBiIj4gIAo8L3NjcmlwdD4KCjwhLS0gWyFbXShodHRwOi8vcmVzLmNsb3VkaW5hcnkuY29tL2R5ZDkxMWttaC9pbWFnZS91cGxvYWQvZl9hdXRvLHFfYXV0bzpiZXN0L3YxNTMwMTEzMDc3L0ltYWdlXzJfdmZ5NDhiLnBuZyldKGh0dHBzOi8vd3d3LmRhdGFjYW1wLmNvbS9jb21tdW5pdHkvdHV0b3JpYWxzL2RhdGEtc2NpZW5jZS1waXRmYWxscykgLS0+CgoKYGBge3Igc2V0dXAgZ2xvYmFsIGNodW5rIHNldHRpbmdzLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoCgltZXNzYWdlID0gRkFMU0UsCgl3YXJuaW5nID0gRkFMU0UsCgljb21tZW50ID0gTkEsCglpbmNsdWRlID0gRkFMU0UsCgl0aWR5ID0gVFJVRQopCmBgYAoKCiMgUiBuZXJlZGUga3VsbGFuxLFsxLFyCgotIFZlcmkgZMO8emVubGVtZQotIMSwc3RhdGlzdGlrIGFuYWxpegotIFdlYiBzYXlmYXPEsSBoYXrEsXJsYW1hIChTdGF0aWsvRGluYW1paykKaHR0cHM6Ly9zYmFsY2kuZ2l0aHViLmlvLyAgCmh0dHBzOi8va2V2aW5ydWUuc2hpbnlhcHBzLmlvL2lzZWUtc2hpbnktY29udGVzdC8KLSBTdW51bSBoYXrEsXJsYW1hIChidSBzdW51bSkKLSBQcm9ncmFtbGFtYQpodHRwczovL3NlcmRhcmJhbGNpLm5ldGxpZnkuY29tL3BhdGh0d2VldHMvCi0gT3RvbWF0aWssIHBlcmlvZGlrIHZlIHRla3JhcmxhbmFiaWxpciByYXBvciBoYXrEsXJsYW1hCmh0dHBzOi8vc2JhbGNpLmdpdGh1Yi5pby9BdXRvSm91cm5hbFdhdGNoL0dhbGxibGFkZGVyUmVjZW50Lmh0bWwKLSBwZGYsIGh0bWwsIHBwdCBvbHXFn3R1cm1hCi0gdGV6IHlhem1hCi0ga2l0YXAgeWF6bWEKLSBDViBvbHXFn3R1cm1hCmh0dHBzOi8vcnB1YnMuY29tL3NiYWxjaS9DViAgIAotIHBvc3RlciBoYXrEsXJsYW1hCi0gcmFwb3IgxZ9hYmxvbnUgb2x1xZ90dXJtYQotIFJvYm90IHV5Z3VsYW1hbGFyxLEgKEFydWRpbm8ga29kdSkKLSAuLi4KCgoKLS0tCgojIFIgZ2VuZXJhdGlvbgoKUiB5xLFsbGFyIGnDp2luZGUgw6dvayBmYXpsYSBkZcSfacWfaW0gZ8O2c3RlcmRpCgpodHRwczovL3Jzcy5vbmxpbmVsaWJyYXJ5LndpbGV5LmNvbS9kb2kvMTAuMTExMS9qLjE3NDAtOTcxMy4yMDE4LjAxMTY5LngKCiFbXShodHRwczovL3dvbC1wcm9kLWNkbi5saXRlcmF0dW1vbmxpbmUuY29tL3BiLWFzc2V0cy9qb3VybmFsLWJhbm5lcnMvMTc0MDk3MTMtMTUwMTM4NDc1NjAzNy5qcGcpCgohWzpzY2FsZSAzMCVdKGh0dHBzOi8vd29sLXByb2QtY2RuLmxpdGVyYXR1bW9ubGluZS5jb20vY21zL2F0dGFjaG1lbnQvMWE0OWMwN2ItYjU2Zi00MzI3LThlOTItNzgyN2VmNTFhN2JiL3NpZ24xMTY5LWdyYS0wMDAyLW0uanBnKQoKCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKHBhdGggPSAiaHR0cHM6Ly93b2wtcHJvZC1jZG4ubGl0ZXJhdHVtb25saW5lLmNvbS9jbXMvYXR0YWNobWVudC8xYTQ5YzA3Yi1iNTZmLTQzMjctOGU5Mi03ODI3ZWY1MWE3YmIvc2lnbjExNjktZ3JhLTAwMDItbS5qcGciKQpgYGAKCgotLS0KCiMgUiB5w7xrbGVtZQoKaHR0cDovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PVhjQkxFVmtucXZZCgoKIVtXaGF0IGlzIFI/XShodHRwOi8vaW1nLnlvdXR1YmUuY29tL3ZpL1hjQkxFVmtucXZZLzAuanBnKQoKCi0tLQoKCiMjIFItcHJvamVjdAoKaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvCgotLS0KCiMjIFJTdHVkaW8KCgohW10oaHR0cHM6Ly9pc21heWMuZ2l0aHViLmlvL3RhbGtzL25lc3MtaW5mZXIvaW1nL2VuZ2luZS5wbmcpCgotLS0KCiMjIyBSU3R1ZGlvCgpbaHR0cHM6Ly93d3cucnN0dWRpby5jb20vXShodHRwczovL3d3dy5yc3R1ZGlvLmNvbS8pCgpbaHR0cHM6Ly93d3cucnN0dWRpby5jb20vcHJvZHVjdHMvcnN0dWRpby9kb3dubG9hZC9dKGh0dHBzOi8vd3d3LnJzdHVkaW8uY29tL3Byb2R1Y3RzL3JzdHVkaW8vZG93bmxvYWQvKQoKW2h0dHBzOi8vbW9kZXJuZGl2ZS5jb20vMi1nZXR0aW5nLXN0YXJ0ZWQuaHRtbF0oaHR0cHM6Ly9tb2Rlcm5kaXZlLmNvbS8yLWdldHRpbmctc3RhcnRlZC5odG1sKQoKLS0tCgojIyMgUlN0dWRpbwoKClshW10oaHR0cDovL3d3dy11c2Vycy55b3JrLmFjLnVrL35lcjEzL1JTdHVkaW8lMjBBbmF0b215LnN2ZyldKGh0dHBzOi8vYnV6enJiZWVsaW5lLmJsb2cvMjAxOC8wNy8wNC9yc3R1ZGlvLWFuYXRvbXkvKQoKCgotLS0KCiMjIyBSU3R1ZGlvIGVrbGVudGlsZXJpCgotIERpc2NvdmVyIGFuZCBpbnN0YWxsIHVzZWZ1bCBSU3R1ZGlvIGFkZGlucwoKaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL2FkZGluc2xpc3QvUkVBRE1FLmh0bWwKCmh0dHBzOi8vcnN0dWRpby5naXRodWIuaW8vcnN0dWRpb2FkZGlucy8KCgpgYGAKZGV2dG9vbHM6Omluc3RhbGxfZ2l0aHViKCJyc3R1ZGlvL2FkZGluZXhhbXBsZXMiLCB0eXBlID0gInNvdXJjZSIpCmBgYAoKCi0tLQoKIyMgTWFjT1MgacOnaW4KCiMjIyBYMTEKCmh0dHBzOi8vd3d3LnhxdWFydHoub3JnLwoKIyMjIEphdmEgT1MKCmh0dHBzOi8vc3VwcG9ydC5hcHBsZS5jb20va2IvZGwxNTcyCgotLS0KCgojIFIgem9yIMWfZXlsZXIgacOnaW4ga29sYXksIGtvbGF5IMWfZXlsZXIgacOnaW4gem9yCgoKLSBbUiBtYWtlcyBlYXN5IHRoaW5ncyBoYXJkLCBhbmQgaGFyZCB0aGluZ3MgZWFzeV0oaHR0cDovL3I0c3RhdHMuY29tL2FydGljbGVzL3doeS1yLWlzLWhhcmQtdG8tbGVhcm4vKQoKCi0gQXluxLEgxZ9leWkgw6dvayBmYXpsYSDFn2VraWxkZSB5YXBtYWsgbcO8bWvDvG4KClIgU3ludGF4IENvbXBhcmlzb246OkNIRUFUIFNIRUVUCgpodHRwczovL3d3dy5hbWVsaWEubW4vU3ludGF4LWNoZWF0c2hlZXQucGRmCgoKLS0tCgoKPGJsb2NrcXVvdGUgY2xhc3M9InR3aXR0ZXItdHdlZXQiIGRhdGEtbGFuZz0iZW4iPjxwIGxhbmc9ImVuIiBkaXI9Imx0ciI+PGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL1JTdGF0cz9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I1JTdGF0czwvYT4g4oCUIFRoZXJlIGFyZSBhbHdheXMgc2V2ZXJhbCB3YXlzIHRvIGRvIHRoZSBzYW1lIHRoaW5nLi4uIG5pY2UgZXhhbXBsZSBvbiB3aXRoIHRoZSBpZGVudGl0eSBtYXRyaXggYnkgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9UZWFTdGF0cz9yZWZfc3JjPXR3c3JjJTVFdGZ3Ij5AVGVhU3RhdHM8L2E+IDxhIGhyZWY9Imh0dHBzOi8vdC5jby9PM0dYZFBpTTMyIj5odHRwczovL3QuY28vTzNHWGRQaU0zMjwvYT48L3A+Jm1kYXNoOyBDb2xpbiBGYXkg8J+kmCAoQF9Db2xpbkZheSkgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9fQ29saW5GYXkvc3RhdHVzLzExMTI3NDY2MzM0Njc1MTg5Nzc/cmVmX3NyYz10d3NyYyU1RXRmdyI+QXByaWwgMSwgMjAxOTwvYT48L2Jsb2NrcXVvdGU+CjxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3BsYXRmb3JtLnR3aXR0ZXIuY29tL3dpZGdldHMuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KCi0tLQoKCiMgUiBwYWtldGxlcmkKCgojIyBOZWRlbiBwYWtldGxlciB2YXIKClshW10oaHR0cHM6Ly9pc21heWMuZ2l0aHViLmlvL3RhbGtzL25lc3MtaW5mZXIvaW1nL2FwcHN0b3JlLnBuZyldKGh0dHBzOi8vaXNtYXljLmdpdGh1Yi5pby90YWxrcy9uZXNzLWluZmVyL3NsaWRlX2RlY2suaHRtbCM3KQoKLS0tCgo8c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly9wbGF0Zm9ybS50d2l0dGVyLmNvbS93aWRnZXRzLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+PGJsb2NrcXVvdGUgY2xhc3M9InR3aXR0ZXItdHdlZXQiIGRhdGEtbGFuZz0iZW4iPjxwIGxhbmc9ImVuIiBkaXI9Imx0ciI+SSBsb3ZlIHRoZSA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2hhc2h0YWcvcnN0YXRzP3NyYz1oYXNoJmFtcDtyZWZfc3JjPXR3c3JjJTVFdGZ3Ij4jcnN0YXRzPC9hPiBjb21tdW5pdHkuPGJyPlNvbWVvbmUgaXMgbGlrZSwgJnF1b3Q7b2ggaGV5IHBlZXBzLCBJIHNhdyBhIGJpZyBuZWVkIGZvciB0aGlzIG11bmRhbmUgYnV0IGRpZmZpY3VsdCB0YXNrIHRoYXQgSSBpbmZyZXF1ZW50bHkgZG8sIHNvIEkgY3JlYXRlZCBhIHBhY2thZ2UgdGhhdCB3aWxsIGxpdGVyYWxseSBzY3JhcGUgdGhlIGxhc3QgYml0cyBvZiBwZWFudXQgYnV0dGVyIG91dCBvZiB0aGUgamFyIGZvciB5b3UuIEl0JiMzOTtzIGNhbGxlZCBwYnBseXIuJnF1b3Q7PGJyPldoYXQgYSB0cmliZS48L3A+Jm1kYXNoOyBGcmFuayBFbGF2c2t5IOG0sOG1g+G1l+G1gyDhtYLhtqbhtrvhtYPKs+G1iCAoQEZyYW5rbHlfRGF0YSkgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9GcmFua2x5X0RhdGEvc3RhdHVzLzEwMTQxODkwOTUyOTQyOTE5Njg/cmVmX3NyYz10d3NyYyU1RXRmdyI+SnVseSAzLCAyMDE4PC9hPjwvYmxvY2txdW90ZT4KCjwhLS0gLS0tIC0tPgoKPCEtLSBodHRwczovL2Jsb2cubWl0Y2hlbGxvaGFyYXdpbGQuY29tL2Jsb2cvdXNlci0yMDE4LWZlYXR1cmUtd2FsbC8gLS0+CgotLS0KCiFbXShodHRwczovL2Jsb2cubWl0Y2hlbGxvaGFyYXdpbGQuY29tL2Jsb2cvMjAxOC0wNy0xMS11c2VyLTIwMTgtZmVhdHVyZS13YWxsX2ZpbGVzL2ZpbmFsLmpwZykKCi0tLQoKIyMgUGFrZXRsZXJpIG5lcmVkZW4gYnVsYWJpbGlyaXoKCi0gQXZhaWxhYmxlIENSQU4gUGFja2FnZXMgQnkgTmFtZSAgCmh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9hdmFpbGFibGVfcGFja2FnZXNfYnlfbmFtZS5odG1sCgotIENSQU4gVGFzayBWaWV3cyAgCmh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi92aWV3cy8KCi0gQmlvY29uZHVjdG9yICAKaHR0cHM6Ly93d3cuYmlvY29uZHVjdG9yLm9yZwoKLSBSZWNvbW1lbmRSICAKaHR0cDovL3JlY29tbWVuZHIuaW5mby8KCi0gcGtnc2VhcmNoICAKQ1JBTiBwYWNrYWdlIHNlYXJjaCAgCmh0dHBzOi8vZ2l0aHViLmNvbS9tZXRhY3Jhbi9wa2dzZWFyY2gKCi0gQ1JBTnNlYXJjaGVyICAKaHR0cHM6Ly9naXRodWIuY29tL1Job0luYy9DUkFOc2VhcmNoZXIgIAoKLSBBd2Vzb21lIFIgIApodHRwczovL2F3ZXNvbWUtci5jb20vICAKCi0tLQoKIyMgS2VuZGkgcGFrZXQgZXZyZW5pbmkgb2x1xZ90dXIKCi0gcGtndmVyc2U6IEJ1aWxkIGEgTWV0YS1QYWNrYWdlIFVuaXZlcnNlICAKaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL3BrZ3ZlcnNlL2luZGV4Lmh0bWwKCgotLS0KCiMjIFIgcGFrZXQgecO8a2xlbWUKCmBgYAppbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiLCBkZXBlbmRlbmNpZXMgPSBUUlVFKQppbnN0YWxsLnBhY2thZ2VzKCJqbXYiLCBkZXBlbmRlbmNpZXMgPSBUUlVFKQppbnN0YWxsLnBhY2thZ2VzKCJxdWVzdGlvbnIiLCBkZXBlbmRlbmNpZXMgPSBUUlVFKQppbnN0YWxsLnBhY2thZ2VzKCJSY21kciIsIGRlcGVuZGVuY2llcyA9IFRSVUUpCmluc3RhbGwucGFja2FnZXMoInN1bW1hcnl0b29scyIpCmBgYAoKYGBge3IgcGFrZXQgecO8a2xlbWV9CiMgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIiwgZGVwZW5kZW5jaWVzID0gVFJVRSkKIyBpbnN0YWxsLnBhY2thZ2VzKCJqbXYiLCBkZXBlbmRlbmNpZXMgPSBUUlVFKQojIGluc3RhbGwucGFja2FnZXMoInF1ZXN0aW9uciIsIGRlcGVuZGVuY2llcyA9IFRSVUUpCiMgaW5zdGFsbC5wYWNrYWdlcygiUmNtZHIiLCBkZXBlbmRlbmNpZXMgPSBUUlVFKQojIGluc3RhbGwucGFja2FnZXMoInN1bW1hcnl0b29scyIpCmBgYAoKLS0tCgojIyBQYWtldCDDp2HEn8Sxcm1hCgpgYGB7ciBwYWtldCBjYWdpcm1hLCBlcnJvcj1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGV2YWwgPSBUUlVFLCBpbmNsdWRlID0gVFJVRX0KIyByZXF1aXJlKHRpZHl2ZXJzZSkgIAojIHJlcXVpcmUoam12KSAgCiMgcmVxdWlyZShxdWVzdGlvbnIpICAKIyBsaWJyYXJ5KHN1bW1hcnl0b29scykgIAojIGxpYnJhcnkoZ2dhbmltYXRlKSAgCmBgYAoKCgotLS0KCiMgUiBpw6dpbiB5YXJkxLFtIGJ1bG1hCgoKYGBge3IgeWFyZMSxbSwgZWNobz1UUlVFfQojID9tZWFuCiMgPz9lZmV0Y2gKIyBoZWxwKG1lcmdlKQojIGV4YW1wbGUobWVyZ2UpCmBgYAoKLS0tCgotIFZpZ25ldHRlCgohWzpzY2FsZSA4MCVdKGZpZ3VyZXMvdmlnbmV0dGUucG5nKQoKLS0tCgotIFJEb2N1bWVudGF0aW9uCmh0dHBzOi8vd3d3LnJkb2N1bWVudGF0aW9uLm9yZwoKLSBSIFBhY2thZ2UgRG9jdW1lbnRhdGlvbgpodHRwczovL3JkcnIuaW8vCgotIEdpdEh1YgoKLSBTdGFja292ZXJmbG93CgpodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tLwoKLSBHb29nbGUgdXlndW4gYW5haHRhciBrZWxpbWUKCi0tLQoKPHNjcmlwdCBhc3luYyBzcmM9Imh0dHBzOi8vcGxhdGZvcm0udHdpdHRlci5jb20vd2lkZ2V0cy5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PjxibG9ja3F1b3RlIGNsYXNzPSJ0d2l0dGVyLXR3ZWV0IiBkYXRhLWxhbmc9ImVuIj48cCBsYW5nPSJlbiIgZGlyPSJsdHIiPkhvdyBJIHVzZSA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2hhc2h0YWcvcnN0YXRzP3NyYz1oYXNoJmFtcDtyZWZfc3JjPXR3c3JjJTVFdGZ3Ij4jcnN0YXRzPC9hPiA8YnI+aC90IDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vVGhlUHJhY3RpY2FsRGV2P3JlZl9zcmM9dHdzcmMlNUV0ZnciPkBUaGVQcmFjdGljYWxEZXY8L2E+IDxhIGhyZWY9Imh0dHBzOi8vdC5jby9lclJuVEcwVWpyIj5waWMudHdpdHRlci5jb20vZXJSblRHMFVqcjwvYT48L3A+Jm1kYXNoOyBFbWlseSBCb3ZlZSAoQGVib3ZlZTA5KSA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2Vib3ZlZTA5L3N0YXR1cy8xMDI4MDM3NTk0OTQ3NDg1Njk2P3JlZl9zcmM9dHdzcmMlNUV0ZnciPkF1Z3VzdCAxMCwgMjAxODwvYT48L2Jsb2NrcXVvdGU+CgoKLS0tCgoKIVtdKGZpZ3VyZXMvR29vZ2xlLXBhY2thZ2UtbmFtZS5wbmcpCgotLS0KCgoKIVtdKGZpZ3VyZXMvR29vZ2xlLXN0YXJ0LXdpdGgtUi5wbmcpCgoKLSBHb29nbGUnZGEgYXJhcmtlbiBgW1JdYCB5YXptYWsgZGEgacWfZSB5YXJheWFiaWxpeW9yLgoKCi0tLQoKLSBzZWFyY2hlciBwYWNrYWdlIPCfk6YKCgpbIVtdKGh0dHBzOi8vY2Ftby5naXRodWJ1c2VyY29udGVudC5jb20vMTJmMGUyZDE4MDQ3ZjFiNWYzNmZiZWIwOWExZDBlNTQ4MjM2ODgzZi82ODc0NzQ3MDczM2EyZjJmNjkyZTY5NmQ2Nzc1NzIyZTYzNmY2ZDJmNWE3MTMyNzI2NzM2NDcyZTY3Njk2NildKGh0dHBzOi8vZ2l0aHViLmNvbS9jb2F0bGVzcy9zZWFyY2hlcikKCgoKLS0tCgotIEF3ZXNvbWUgQ2hlYXRzaGVldApodHRwczovL2dpdGh1Yi5jb20vZGV0YWlseWFuZy9hd2Vzb21lLWNoZWF0c2hlZXQKCmh0dHA6Ly9jcmFuLnItcHJvamVjdC5vcmcvZG9jL2NvbnRyaWIvQmFnZ290dC1yZWZjYXJkLXYyLnBkZgoKaHR0cHM6Ly93d3cucnN0dWRpby5jb20vcmVzb3VyY2VzL2NoZWF0c2hlZXRzLwoKCi0gQXdlc29tZSBSCgpodHRwczovL2dpdGh1Yi5jb20vcWlud2YvYXdlc29tZS1SI3JlYWRtZQoKaHR0cHM6Ly9hd2Vzb21lLXIuY29tLwoKCi0gVHdpdHRlcgoKaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL3JzdGF0cz9zcmM9aGFzaAoKLS0tCgoKLSBVc2UgUmVwcm9kdWNpYmxlIEV4YW1wbGVzIFdoZW4gQXNraW5nICAKCjxibG9ja3F1b3RlIGNsYXNzPSJ0d2l0dGVyLXR3ZWV0IiBkYXRhLWxhbmc9ImVuIj48cCBsYW5nPSJlbiIgZGlyPSJsdHIiPkdvdCBhIHF1ZXN0aW9uIHRvIGFzayBvbiA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL1NsYWNrSFE/cmVmX3NyYz10d3NyYyU1RXRmdyI+QFNsYWNrSFE8L2E+IG9yIHBvc3Qgb24gPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9naXRodWI/cmVmX3NyYz10d3NyYyU1RXRmdyI+QGdpdGh1YjwvYT4/IE5vIHRpbWUgdG8gcmVhZCB0aGUgbG9uZyBwb3N0IG9uIGhvdyB0byB1c2UgcmVwcmV4PyBIZXJlIGlzIGEgMjAtc2Vjb25kIGdpZiBmb3IgeW91IHRvIGZvcm1hdCB5b3VyIFIgY29kZXMgbmljZWx5IGFuZCBmb3Igb3RoZXJzIHRvIHJlcHJvZHVjZSB5b3VyIHByb2JsZW0uIChBbiBleGFtcGxlIGZyb20gYSB0YWxrIGdpdmVuIGJ5IDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vSmVubnlCcnlhbj9yZWZfc3JjPXR3c3JjJTVFdGZ3Ij5ASmVubnlCcnlhbjwvYT4pIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vaGFzaHRhZy9yc3RhdD9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I3JzdGF0PC9hPiA8YSBocmVmPSJodHRwczovL3QuY28vZ3B1R1hwRklzWCI+cGljLnR3aXR0ZXIuY29tL2dwdUdYcEZJc1g8L2E+PC9wPiZtZGFzaDsgWmhpWWFuZyAoQHpoaWlpeWFuZykgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS96aGlpaXlhbmcvc3RhdHVzLzEwNTMwMDYwMDM3MTE1Njk5MjA/cmVmX3NyYz10d3NyYyU1RXRmdyI+T2N0b2JlciAxOCwgMjAxODwvYT48L2Jsb2NrcXVvdGU+PHNjcmlwdCBhc3luYyBzcmM9Imh0dHBzOi8vcGxhdGZvcm0udHdpdHRlci5jb20vd2lkZ2V0cy5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgoKCi0gS2VlcGluZyB1cCB0byBkYXRlIHdpdGggUiBuZXdzICAKaHR0cHM6Ly9tYXNhbG1vbi5ldS8yMDE5LzAxLzI1L3VwdG9kYXRlLyAgCgotLS0KCiMgUnN0dWRpbyBpbGUgcHJvamUgb2x1xZ90dXJtYQoKaHR0cHM6Ly9zdXBwb3J0LnJzdHVkaW8uY29tL2hjL2VuLXVzL2FydGljbGVzLzIwMDUyNjIwNy1Vc2luZy1Qcm9qZWN0cwoKIVtdKGh0dHA6Ly93d3cucnN0dWRpby5jb20vaW1hZ2VzL2RvY3MvcHJvamVjdHNfbmV3LnBuZykKCi0tLQoKICAgICAgICAgICAgICAgICMgUlN0dWRpbyBpbGUgdmVyaSB5w7xrbGVtZQoKaHR0cHM6Ly9zdXBwb3J0LnJzdHVkaW8uY29tL2hjL2VuLXVzL2FydGljbGVzLzIxODYxMTk3Ny1JbXBvcnRpbmctRGF0YS13aXRoLVJTdHVkaW8KCiFbXShodHRwczovL3N1cHBvcnQucnN0dWRpby5jb20vaGMvZW4tdXMvYXJ0aWNsZV9hdHRhY2htZW50cy8yMDYyNzc2MTgvZGF0YS1pbXBvcnQtb3ZlcnZpZXcuZ2lmKQoKLS0tCgojIyBFeGNlbAoKIyMgU1BTUwoKIyMgQ1NWCgoKLS0tCgojIFZlcml5aSBnw7Zyw7xudMO8bGVtZQoKPHNjcmlwdCBhc3luYyBzcmM9Imh0dHBzOi8vcGxhdGZvcm0udHdpdHRlci5jb20vd2lkZ2V0cy5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PjxibG9ja3F1b3RlIGNsYXNzPSJ0d2l0dGVyLXR3ZWV0IiBkYXRhLWxhbmc9ImVuIj48cCBsYW5nPSJlbiIgZGlyPSJsdHIiPlNwcmVhZHNoZWV0IHVzZXJzIHVzaW5nIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vaGFzaHRhZy9yc3RhdHM/c3JjPWhhc2gmYW1wO3JlZl9zcmM9dHdzcmMlNUV0ZnciPiNyc3RhdHM8L2E+OiAgd2hlcmUmIzM5O3MgdGhlIGRhdGE/PGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL3JzdGF0cz9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I3JzdGF0czwvYT4gdXNlcnMgdXNpbmcgc3ByZWFkc2hlZXRzOiAgd2hlcmUmIzM5O3MgdGhlIGNvZGU/PC9wPiZtZGFzaDsgTGVvbmFyZCBLaWVmZXIgKEBsZW5raWVmZXIpIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vbGVua2llZmVyL3N0YXR1cy8xMDE1NTg3NDc1NTgwOTU2NjcyP3JlZl9zcmM9dHdzcmMlNUV0ZnciPkp1bHkgNywgMjAxODwvYT48L2Jsb2NrcXVvdGU+CgotLS0KCiMgVmVyaXlpIGfDtnLDvG50w7xsZW1lCgpgYGB7ciwgcmVzdWx0cz0ibWFya3VwIn0KIyBsaWJyYXJ5KG55Y2ZsaWdodHMxMykKIyBzdW1tYXJ5KGZsaWdodHMpCmBgYAoKCgpgYGAKVmlldyhkYXRhKQpgYGAKCgpgYGAKZGF0YQpgYGAKCgpgYGAKaGVhZApgYGAKCgpgYGAKdGFpbApgYGAKCgpgYGAKZ2xpbXBzZQpgYGAKCgpgYGAKc3RyCmBgYAoKCmBgYApza2ltcjo6c2tpbSgpCmBgYAoKLS0tCgoKIyBWZXJpeWkgZGXEn2nFn3Rpcm1lCgojIyBWZXJpeWkga29kIGlsZSBkZcSfacWfdGlyZWxpbQoKIyMgVmVyaXlpIGVrbGVudGlsZXJsZSBkZcSfacWfdGlybWUKCiFbOnNjYWxlIDMwJV0oZmlndXJlcy9jaGFuZ2VfZGF0YS5wbmcpCgoKLS0tCgoKIyMgUlN0dWRpbyBhcmFjxLFsxLHEn8SxeWxhIHJlY29kZQoKKnF1ZXN0aW9uciogcGFrZXRpIGt1bGxhbsSxbGFjYWsKCiFbOnNjYWxlIDMwJV0oZmlndXJlcy9sZXZlbF9yZWNvZGUucG5nKQoKCi0tLQoKCgpodHRwczovL2p1YmEuZ2l0aHViLmlvL3F1ZXN0aW9uci9hcnRpY2xlcy9yZWNvZGluZ19hZGRpbnMuaHRtbAoKCiFbXShodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vanViYS9xdWVzdGlvbnIvbWFzdGVyL3Jlc291cmNlcy9zY3JlZW5zaG90cy9pcmVjXzEucG5nKQoKCi0tLQoKIVtdKGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9qdWJhL3F1ZXN0aW9uci9tYXN0ZXIvcmVzb3VyY2VzL3NjcmVlbnNob3RzL2lyZWNfMi5wbmcpCgoKLS0tCgohW10oaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2p1YmEvcXVlc3Rpb25yL21hc3Rlci9yZXNvdXJjZXMvc2NyZWVuc2hvdHMvaXJlY18zLnBuZykKCgotLS0KCiMgQmFzaXQgdGFuxLFtbGF5xLFjxLEgaXN0YXRpc3Rpa2xlcgoKYGBgCnN1bW1hcnkoKQpgYGAKCmBgYAptZWFuCmBgYAoKYGBgCm1lZGlhbgpgYGAKCmBgYAptaW4KYGBgCgpgYGAKbWF4CmBgYAoKYGBgCnNkCmBgYAoKYGBgCnRhYmxlKCkKYGBgCgotLS0KCgpgYGB7ciBkZXNjcmlwdGl2ZSwgZWNobz1UUlVFLCBpbmNsdWRlID0gVFJVRX0KbGlicmFyeShyZWFkcikKaXJpc2RhdGEgPC0gcmVhZF9jc3YoImRhdGEvaXJpcy5jc3YiKQoKam12OjpkZXNjcmlwdGl2ZXMoCiAgICBkYXRhID0gaXJpc2RhdGEsCiAgICB2YXJzID0gIlNlcGFsLkxlbmd0aCIsCiAgICBzcGxpdEJ5ID0gIlNwZWNpZXMiLAogICAgZnJlcSA9IFRSVUUsCiAgICBoaXN0ID0gVFJVRSwKICAgIGRlbnMgPSBUUlVFLAogICAgYmFyID0gVFJVRSwKICAgIGJveCA9IFRSVUUsCiAgICB2aW9saW4gPSBUUlVFLAogICAgZG90ID0gVFJVRSwKICAgIG1vZGUgPSBUUlVFLAogICAgc3VtID0gVFJVRSwKICAgIHNkID0gVFJVRSwKICAgIHZhcmlhbmNlID0gVFJVRSwKICAgIHJhbmdlID0gVFJVRSwKICAgIHNlID0gVFJVRSwKICAgIHNrZXcgPSBUUlVFLAogICAga3VydCA9IFRSVUUsCiAgICBxdWFydCA9IFRSVUUsCiAgICBwY0VxR3IgPSBUUlVFKQpgYGAKCi0tLQoKYGBge3Igc2NhdHRlciwgZWNobz1UUlVFLCBpbmNsdWRlPVRSVUV9CiMgaW5zdGFsbC5wYWNrYWdlcygic2NhdHIiKQpzY2F0cjo6c2NhdCgKICAgIGRhdGEgPSBpcmlzZGF0YSwKICAgIHggPSAiU2VwYWwuTGVuZ3RoIiwKICAgIHkgPSAiU2VwYWwuV2lkdGgiLAogICAgZ3JvdXAgPSAiU3BlY2llcyIsCiAgICBtYXJnID0gImRlbnMiLAogICAgbGluZSA9ICJsaW5lYXIiLAogICAgc2UgPSBUUlVFKQpgYGAKCi0tLQoKIyMgc3VtbWFyeXRvb2xzCgpodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvc3VtbWFyeXRvb2xzL3ZpZ25ldHRlcy9JbnRyb2R1Y3Rpb24uaHRtbAoKYGBge3IsIGluY2x1ZGU9VFJVRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30KbGlicmFyeShzdW1tYXJ5dG9vbHMpCnN1bW1hcnl0b29sczo6ZnJlcShpcmlzJFNwZWNpZXMsIHN0eWxlID0gInJtYXJrZG93biIpCmBgYAoKCi0tLQoKYGBge3IsIGluY2x1ZGU9VFJVRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30Kc3VtbWFyeXRvb2xzOjpmcmVxKGlyaXMkU3BlY2llcywgcmVwb3J0Lm5hcyA9IEZBTFNFLCBzdHlsZSA9ICJybWFya2Rvd24iLCBoZWFkaW5ncyA9IEZBTFNFKQpgYGAKCgotLS0KCgpgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQp3aXRoKHRvYmFjY28sIHByaW50KGN0YWJsZShzbW9rZXIsIGRpc2Vhc2VkKSwgbWV0aG9kID0gJ3JlbmRlcicpKQpgYGAKCgotLS0KCgpgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQp3aXRoKHRvYmFjY28sCiAgICAgcHJpbnQoY3RhYmxlKHNtb2tlciwgZGlzZWFzZWQsIHByb3AgPSAnbicsIHRvdGFscyA9IEZBTFNFKSwKICAgICAgICAgICBvbWl0LmhlYWRpbmdzID0gVFJVRSwgbWV0aG9kID0gInJlbmRlciIpKQpgYGAKCi0tLQoKYGBge3IsIGluY2x1ZGU9VFJVRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30Kc3VtbWFyeXRvb2xzOjpkZXNjcihpcmlzLCBzdHlsZSA9ICJybWFya2Rvd24iKQpgYGAKCi0tLQoKYGBge3IsIGluY2x1ZGU9VFJVRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30KZGVzY3IoaXJpcywKICAgICAgc3RhdHMgPSBjKCJtZWFuIiwgInNkIiwgIm1pbiIsICJtZWQiLCAibWF4IiksCiAgICAgIHRyYW5zcG9zZSA9IFRSVUUsCiAgICAgIGhlYWRpbmdzID0gRkFMU0UsCiAgICAgIHN0eWxlID0gInJtYXJrZG93biIpCmBgYAoKLS0tCgpgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQojIHZpZXcoZGZTdW1tYXJ5KGlyaXMpKQoKYGBgCgoKIVtdKGZpZ3VyZXMvZGZzdW1tYXJ5LnBuZykKCjwhLS0gLS0tIC0tPgoKPCEtLSBgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfSAtLT4KPCEtLSBkZlN1bW1hcnkodG9iYWNjbywgLS0+CjwhLS0gICAgICAgICAgIHBsYWluLmFzY2lpID0gRkFMU0UsIC0tPgo8IS0tICAgICAgICAgICBzdHlsZSA9ICJncmlkIikgLS0+CjwhLS0gYGBgIC0tPgoKCi0tLQoKYGBge3IsIGluY2x1ZGU9VFJVRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30KIyBGaXJzdCBzYXZlIHRoZSByZXN1bHRzCmlyaXNfc3RhdHNfYnlfc3BlY2llcyA8LSBieShkYXRhID0gaXJpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORElDRVMgPSBpcmlzJFNwZWNpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVU4gPSBkZXNjciwgc3RhdHMgPSBjKCJtZWFuIiwgInNkIiwgIm1pbiIsICJtZWQiLCAibWF4IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3Bvc2UgPSBUUlVFKQojIFRoZW4gdXNlIHZpZXcoKSwgbGlrZSBzbzoKdmlldyhpcmlzX3N0YXRzX2J5X3NwZWNpZXMsIG1ldGhvZCA9ICJwYW5kZXIiLCBzdHlsZSA9ICJybWFya2Rvd24iKQpgYGAKCgotLS0KCgpgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQojIHZpZXcoaXJpc19zdGF0c19ieV9zcGVjaWVzKQpgYGAKCiFbXShmaWd1cmVzL0Rlc2NyaXB0aXZlU3RhdGlzdGljcy5wbmcpCgotLS0KCmBgYHtyLCBpbmNsdWRlPVRSVUUsIGNvbW1lbnQ9TkEsIHByb21wdD1GQUxTRSwgY2FjaGU9RkFMU0UsIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CmRhdGEodG9iYWNjbykgIyB0b2JhY2NvIGlzIGFuIGV4YW1wbGUgZGF0YWZyYW1lIGluY2x1ZGVkIGluIHRoZSBwYWNrYWdlCkJNSV9ieV9hZ2UgPC0gd2l0aCh0b2JhY2NvLAogICAgICAgICAgICAgICAgICAgYnkoQk1JLCBhZ2UuZ3IsIGRlc2NyLAogICAgICAgICAgICAgICAgICAgICAgc3RhdHMgPSBjKCJtZWFuIiwgInNkIiwgIm1pbiIsICJtZWQiLCAibWF4IikpKQp2aWV3KEJNSV9ieV9hZ2UsICJwYW5kZXIiLCBzdHlsZSA9ICJybWFya2Rvd24iKQpgYGAKCi0tLQoKYGBge3IsIGluY2x1ZGU9VFJVRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30KQk1JX2J5X2FnZSA8LSB3aXRoKHRvYmFjY28sCiAgICAgICAgICAgICAgICAgICBieShCTUksIGFnZS5nciwgZGVzY3IsICB0cmFuc3Bvc2UgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgc3RhdHMgPSBjKCJtZWFuIiwgInNkIiwgIm1pbiIsICJtZWQiLCAibWF4IikpKQoKdmlldyhCTUlfYnlfYWdlLCAicGFuZGVyIiwgc3R5bGUgPSAicm1hcmtkb3duIiwgb21pdC5oZWFkaW5ncyA9IFRSVUUpCmBgYAoKPCEtLSAtLS0gLS0+Cgo8IS0tIGBgYHtyLCBpbmNsdWRlPVRSVUUsIGNvbW1lbnQ9TkEsIHByb21wdD1GQUxTRSwgY2FjaGU9RkFMU0UsIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9IC0tPgo8IS0tIHRvYmFjY29fc3Vic2V0IDwtIHRvYmFjY29bICxjKCJnZW5kZXIiLCAiYWdlLmdyIiwgInNtb2tlciIpXSAtLT4KPCEtLSBmcmVxX3RhYmxlcyA8LSBsYXBwbHkodG9iYWNjb19zdWJzZXQsIGZyZXEpIC0tPgoKPCEtLSAjIHZpZXcoZnJlcV90YWJsZXMsIGZvb3Rub3RlID0gTkEsIGZpbGUgPSAnZnJlcS10YWJsZXMuaHRtbCcpIC0tPgo8IS0tIGBgYCAtLT4KCi0tLQoKYGBge3IsIGluY2x1ZGU9VFJVRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30Kd2hhdC5pcyhpcmlzKQpgYGAKCjwhLS0gLS0tIC0tPgoKPCEtLSBgYGB7cn0gLS0+CjwhLS0gZnJlcSh0b2JhY2NvJGdlbmRlciwgc3R5bGUgPSAncm1hcmtkb3duJykgLS0+CjwhLS0gYGBgIC0tPgoKPCEtLSAtLS0gLS0+Cgo8IS0tIGBgYHtyfSAtLT4KPCEtLSBwcmludChmcmVxKHRvYmFjY28kZ2VuZGVyKSwgbWV0aG9kID0gJ3JlbmRlcicpIC0tPgo8IS0tIGBgYCAtLT4KCjwhLS0gLS0tIC0tPgoKPCEtLSAjIyBza2ltciAtLT4KCjwhLS0gYGBgIC0tPgo8IS0tIGxpYnJhcnkoc2tpbXIpIC0tPgo8IS0tIHNraW0oZGYpIC0tPgo8IS0tIGBgYCAtLT4KCi0tLQoKIyMgRGF0YUV4cGxvcmVyCgpgYGAKbGlicmFyeShEYXRhRXhwbG9yZXIpCkRhdGFFeHBsb3Jlcjo6Y3JlYXRlX3JlcG9ydChkZikKYGBgCgoKWyFbXShodHRwczovL3N0YXRpYzEuc3F1YXJlc3BhY2UuY29tL3N0YXRpYy81OGVlZjg4NDZhNDk2M2U0Mjk2ODdhNGQvdC81YmRmYzJmYjRkN2E5YzA0ZWU1MGI3YWEvMTU0MTM5MTE2MDcwMi9kYXRhRXhwbG9yZXJHaWZMZy5naWY/Zm9ybWF0PTE1MDB3KV0oaHR0cHM6Ly93d3cubGl0dGxlbWlzc2RhdGEuY29tL2Jsb2cvc2ltcGxlLWVkYSkKCgoKLS0tCgojIyBpbnNwZWN0ZGYKCmh0dHBzOi8vZ2l0aHViLmNvbS9hbGFzdGFpcnJ1c2h3b3J0aC9pbnNwZWN0ZGYKCgotLS0KCiMjIEdyYWZpa2xlcgoKYGBge3IgZWNobz1UUlVFfQojIGxpYnJhcnkoZ2dwbG90MikKIyBsaWJyYXJ5KG1vc2FpYykKIyBtUGxvdChpcmlzZGF0YSkKYGBgCgo8IS0tIC0tLSAtLT4KCgo8IS0tIGBgYHtyLCByZXN1bHRzPSJhc2lzIn0gLS0+CjwhLS0gY3RhYmxlKHRvYmFjY28kZ2VuZGVyLCB0b2JhY2NvJHNtb2tlciwgc3R5bGUgPSAncm1hcmtkb3duJykgLS0+CjwhLS0gYGBgIC0tPgoKPCEtLSAtLS0gLS0+CgoKPCEtLSBgYGB7cn0gLS0+CjwhLS0gcHJpbnQoY3RhYmxlKHRvYmFjY28kZ2VuZGVyLCB0b2JhY2NvJHNtb2tlciksIG1ldGhvZCA9ICdyZW5kZXInKSAtLT4KPCEtLSBgYGAgLS0+CgoKPCEtLSAtLS0gLS0+CgpgYGAKZGVzY3IodG9iYWNjbywgc3R5bGUgPSAncm1hcmtkb3duJykKCnByaW50KGRlc2NyKHRvYmFjY28pLCBtZXRob2QgPSAncmVuZGVyJywgdGFibGUuY2xhc3NlcyA9ICdzdC1zbWFsbCcpCgpkZlN1bW1hcnkodG9iYWNjbywgc3R5bGUgPSAnZ3JpZCcsIHBsYWluLmFzY2lpID0gRkFMU0UpCgpwcmludChkZlN1bW1hcnkodG9iYWNjbywgZ3JhcGgubWFnbmlmID0gMC43NSksIG1ldGhvZCA9ICdyZW5kZXInKQpgYGAKCi0tLQoKQSBiZWdpbm5lciBraXQgZm9yICNyc3RhdHMKVGhlIExhbmRzY2FwZSBvZiBSIFBhY2thZ2VzIGZvciBBdXRvbWF0ZWQgRXhwbG9yYXRvcnkgRGF0YSBBbmFseXNpcwpodHRwczovL2pvdXJuYWwuci1wcm9qZWN0Lm9yZy9hcmNoaXZlLzIwMTkvUkotMjAxOS0wMzMvCgoKQGFydGljbGV7UkotMjAxOS0wMzMsCiAgYXV0aG9yID0ge01hdGV1c3ogU3RhbmlhayBhbmQgUHJ6ZW15c8WCYXcgQmllY2VrfSwKICB0aXRsZSA9IHt7VGhlIExhbmRzY2FwZSBvZiBSIFBhY2thZ2VzIGZvciBBdXRvbWF0ZWQgRXhwbG9yYXRvcnkgRGF0YQogICAgICAgICAgQW5hbHlzaXN9fSwKICB5ZWFyID0gezIwMTl9LAogIGpvdXJuYWwgPSB7e1RoZSBSIEpvdXJuYWx9fSwKICBkb2kgPSB7MTAuMzI2MTQvUkotMjAxOS0wMzN9LAogIHVybCA9IHtodHRwczovL2pvdXJuYWwuci1wcm9qZWN0Lm9yZy9hcmNoaXZlLzIwMTkvUkotMjAxOS0wMzMvaW5kZXguaHRtbH0KfQoKCgotLS0KCgoKPGJsb2NrcXVvdGUgY2xhc3M9InR3aXR0ZXItdHdlZXQiIGRhdGEtbGFuZz0iZW4iPjxwIGxhbmc9ImVuIiBkaXI9Imx0ciI+SGVyZSwgYnVpbGRpbmcgdXAgYSA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2hhc2h0YWcvZ2dwbG90Mj9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I2dncGxvdDI8L2E+IGFzIHNsb3dseSBhcyBwb3NzaWJsZSwgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL3JzdGF0cz9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I3JzdGF0czwvYT4uICBJbmNyZW1lbnRhbCBhZGp1c3RtZW50cy4gIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vaGFzaHRhZy9yc3RhdHN0ZWFjaGluZ2lkZWFzP3NyYz1oYXNoJmFtcDtyZWZfc3JjPXR3c3JjJTVFdGZ3Ij4jcnN0YXRzdGVhY2hpbmdpZGVhczwvYT4gPGEgaHJlZj0iaHR0cHM6Ly90LmNvL25VdWxRbDhiUGgiPnBpYy50d2l0dGVyLmNvbS9uVXVsUWw4YlBoPC9hPjwvcD4mbWRhc2g7IEdpbmEgUmV5bm9sZHMgKEBFdmFNYWVSZXkpIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vRXZhTWFlUmV5L3N0YXR1cy8xMDI5MTA0NjU2NzYzNTcyMjI2P3JlZl9zcmM9dHdzcmMlNUV0ZnciPkF1Z3VzdCAxMywgMjAxODwvYT48L2Jsb2NrcXVvdGU+PHNjcmlwdCBhc3luYyBzcmM9Imh0dHBzOi8vcGxhdGZvcm0udHdpdHRlci5jb20vd2lkZ2V0cy5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgoKCi0tLQoKClshW10oaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2RyZWFtUnMvZXNxdWlzc2UvbWFzdGVyL21hbi9maWd1cmVzL2VzcXVpc3NlLmdpZildKGh0dHBzOi8vZ2l0aHViLmNvbS9kcmVhbVJzL2VzcXVpc3NlKQoKCjxibG9ja3F1b3RlIGNsYXNzPSJ0d2l0dGVyLXR3ZWV0IiBkYXRhLWxhbmc9ImVuIj48cCBsYW5nPSJlbiIgZGlyPSJsdHIiPkRyZWFtaW5nIG9mIGEgZmFuY3kgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL1JzdGF0cz9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I1JzdGF0czwvYT4gPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL2dncGxvdD9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I2dncGxvdDwvYT4gPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL2RhdGF2aXo/c3JjPWhhc2gmYW1wO3JlZl9zcmM9dHdzcmMlNUV0ZnciPiNkYXRhdml6PC9hPiBidXQgc3RpbGwgc2NhcmVkIG9mIHR5cGluZyA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2hhc2h0YWcvY29kZT9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I2NvZGU8L2E+PyA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL19wdmljdG9ycj9yZWZfc3JjPXR3c3JjJTVFdGZ3Ij5AX3B2aWN0b3JyPC9hPiBlc3F1aXNzZSBwYWNrYWdlIGhhcyB5b3UgY292ZXJlZCA8YSBocmVmPSJodHRwczovL3QuY28vMXZJRFhjVkFBRiI+aHR0cHM6Ly90LmNvLzF2SURYY1ZBQUY8L2E+IDxhIGhyZWY9Imh0dHBzOi8vdC5jby9SbFRrcHRuck52Ij5waWMudHdpdHRlci5jb20vUmxUa3B0bnJOdjwvYT48L3A+Jm1kYXNoOyBSYWRvc2xhdyBQYW5jemFrIChAUlBhbmN6YWspIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vUlBhbmN6YWsvc3RhdHVzLzEwNDcwMTk1ODg2NTgwNDA4MzI/cmVmX3NyYz10d3NyYyU1RXRmdyI+T2N0b2JlciAyLCAyMDE4PC9hPjwvYmxvY2txdW90ZT4KPHNjcmlwdCBhc3luYyBzcmM9Imh0dHBzOi8vcGxhdGZvcm0udHdpdHRlci5jb20vd2lkZ2V0cy5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgoKCgo8IS0tICMjIFRhYmxvbGFyIC0tPgoKCi0tLQoKCiMgQmF6xLEgYXJhecO8emxlcgoKaHR0cHM6Ly9zYmFsY2kuZ2l0aHViLmlvL015UkNvZGVzRm9yRGF0YUFuYWx5c2lzL1ItQXJheXV6bGVyLm5iLmh0bWwKCgotLS0KCgojIyBSY21kcgoKYGBgCmxpYnJhcnkoUmNtZHIpCgpSY21kcjo6Q29tbWFuZGVyKCkKCmBgYAoKCi0gQSBDb21wYXJhdGl2ZSBSZXZpZXcgb2YgdGhlIFIgQ29tbWFuZGVyIEdVSSBmb3IgUgoKaHR0cDovL3I0c3RhdHMuY29tL2FydGljbGVzL3NvZnR3YXJlLXJldmlld3Mvci1jb21tYW5kZXIvCgoKLS0tCgojIyBqYW1vdmkKCmh0dHBzOi8vd3d3LmphbW92aS5vcmcvCgo8IS0tICFbIVtdKGh0dHBzOi8vd3d3LmphbW92aS5vcmcvYXNzZXRzL21haW4tc2NyZWVuc2hvdC5wbmcpXShodHRwczovL3d3dy5qYW1vdmkub3JnLykgLS0+CgoKaHR0cHM6Ly9ibG9nLmphbW92aS5vcmcvMjAxOC8wNy8zMC9yai5odG1sCgo8IS0tICFbIVtdKGh0dHBzOi8vYmxvZy5qYW1vdmkub3JnL2Fzc2V0cy9pbWFnZXMvcmoucG5nKV0oaHR0cHM6Ly9ibG9nLmphbW92aS5vcmcvMjAxOC8wNy8zMC9yai5odG1sKSAtLT4KCi0tLQoKIyBSIG5lcmVkZW4gw7bEn3JlbmlsaXIKCmh0dHBzOi8vc2JhbGNpLmdpdGh1Yi5pby9NeVJDb2Rlc0ZvckRhdGFBbmFseXNpcy9XaGVyZVRvTGVhcm5SLm5iLmh0bWwKCi0tLQoKIyBTb25yYWtpIEtvbnVsYXIKCi0gUlN0dWRpbyBpbGUgR2l0SHViIGt1bGxhbsSxbcSxCi0gUiBNYXJrZG93biB2ZSBSIE5vdGVib29rIGlsZSB0ZWtyYXJsYW5hYmlsaXIgcmFwb3IKLSBIaXBvdGV6IHRlc3RsZXJpCgoKCi0tLS0tCgoKIyBHZXJpIEJpbGRpcmltCgotIEdlcmkgYmlsZGlyaW0gacOnaW4gdMSxa2xhecSxbsSxejogX1tHZXJpIGJpbGRpcmltIGZvcm11XShodHRwczovL2dvby5nbC9mb3Jtcy9ZakdaNURIZ3RQbFIxUm5CMylfCgoKLS0tCgoKPHNjcmlwdCBpZD0iZHNxLWNvdW50LXNjciIgc3JjPSIvL2h0dHBzLXNiYWxjaS1naXRodWItaW8uZGlzcXVzLmNvbS9jb3VudC5qcyIgYXN5bmM+PC9zY3JpcHQ+Cgo8ZGl2IGlkPSJkaXNxdXNfdGhyZWFkIj48L2Rpdj4KPHNjcmlwdD4KCi8qKgoqICBSRUNPTU1FTkRFRCBDT05GSUdVUkFUSU9OIFZBUklBQkxFUzogRURJVCBBTkQgVU5DT01NRU5UIFRIRSBTRUNUSU9OIEJFTE9XIFRPIElOU0VSVCBEWU5BTUlDIFZBTFVFUyBGUk9NIFlPVVIgUExBVEZPUk0gT1IgQ01TLgoqICBMRUFSTiBXSFkgREVGSU5JTkcgVEhFU0UgVkFSSUFCTEVTIElTIElNUE9SVEFOVDogaHR0cHM6Ly9kaXNxdXMuY29tL2FkbWluL3VuaXZlcnNhbGNvZGUvI2NvbmZpZ3VyYXRpb24tdmFyaWFibGVzKi8KLyoKdmFyIGRpc3F1c19jb25maWcgPSBmdW5jdGlvbiAoKSB7CnRoaXMucGFnZS51cmwgPSBQQUdFX1VSTDsgIC8vIFJlcGxhY2UgUEFHRV9VUkwgd2l0aCB5b3VyIHBhZ2UncyBjYW5vbmljYWwgVVJMIHZhcmlhYmxlCnRoaXMucGFnZS5pZGVudGlmaWVyID0gUEFHRV9JREVOVElGSUVSOyAvLyBSZXBsYWNlIFBBR0VfSURFTlRJRklFUiB3aXRoIHlvdXIgcGFnZSdzIHVuaXF1ZSBpZGVudGlmaWVyIHZhcmlhYmxlCn07CiovCihmdW5jdGlvbigpIHsgLy8gRE9OJ1QgRURJVCBCRUxPVyBUSElTIExJTkUKdmFyIGQgPSBkb2N1bWVudCwgcyA9IGQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CnMuc3JjID0gJ2h0dHBzOi8vaHR0cHMtc2JhbGNpLWdpdGh1Yi1pby5kaXNxdXMuY29tL2VtYmVkLmpzJzsKcy5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGltZXN0YW1wJywgK25ldyBEYXRlKCkpOwooZC5oZWFkIHx8IGQuYm9keSkuYXBwZW5kQ2hpbGQocyk7Cn0pKCk7Cjwvc2NyaXB0Pgo8bm9zY3JpcHQ+UGxlYXNlIGVuYWJsZSBKYXZhU2NyaXB0IHRvIHZpZXcgdGhlIDxhIGhyZWY9Imh0dHBzOi8vZGlzcXVzLmNvbS8/cmVmX25vc2NyaXB0Ij5jb21tZW50cyBwb3dlcmVkIGJ5IERpc3F1cy48L2E+PC9ub3NjcmlwdD4KCgotLS0KCgo8IS0tIGBgYCAtLT4KPCEtLSAjIFNhdmUgRmluYWwgRGF0YSAtLT4KCjwhLS0gc2F2ZWQgZGF0YSBhZnRlciBhbmFseXNpcyB0byBgRGF0YS1BZnRlci1BbmFseXNpcy54bHN4YC4gLS0+Cgo8IS0tIHNhdmVSRFMobXlkYXRhLCAiRGF0YS1BZnRlci1BbmFseXNpcy5yZHMiKSAtLT4KCjwhLS0gd3JpdGV4bDo6d3JpdGVfeGxzeChteWRhdGEsICJEYXRhLUFmdGVyLUFuYWx5c2lzLnhsc3giKSAtLT4KCjwhLS0gZmlsZS5pbmZvKCJEYXRhLUFmdGVyLUFuYWx5c2lzLnhsc3giKSRjdGltZSAtLT4KCjwhLS0gYGBgIC0tPgoKPCEtLSAtLS0gLS0+CgoKIyBMaWJyYXJpZXMgVXNlZAoKYGBge3J9CmNpdGF0aW9uKCkKYGBgCgpgYGAKY2l0YXRpb24oInRpZHl2ZXJzZSIpCmNpdGF0aW9uKCJmb3JlaWduIikKY2l0YXRpb24oInRpZHlsb2ciKQpjaXRhdGlvbigiamFuaXRvciIpCmNpdGF0aW9uKCJqbXYiKQpjaXRhdGlvbigidGFuZ3JhbSIpCmNpdGF0aW9uKCJmaW5hbGZpdCIpCmNpdGF0aW9uKCJzdW1tYXJ5dG9vbHMiKQpjaXRhdGlvbigiZ2dzdGF0cGxvdCIpCmNpdGF0aW9uKCJyZWFkeGwiKQpgYGAKCgpgYGB7ciBldmFsPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQpjaXRhdGlvbigidGlkeXZlcnNlIikKY2l0YXRpb24oImZvcmVpZ24iKQpjaXRhdGlvbigidGlkeWxvZyIpCmNpdGF0aW9uKCJqYW5pdG9yIikKY2l0YXRpb24oImptdiIpCmNpdGF0aW9uKCJ0YW5ncmFtIikKY2l0YXRpb24oImZpbmFsZml0IikKY2l0YXRpb24oInN1bW1hcnl0b29scyIpCmNpdGF0aW9uKCJnZ3N0YXRwbG90IikKY2l0YXRpb24oInJlYWR4bCIpCmBgYAoKCjwhLS0gLS0tIC0tPgoKCjwhLS0gYGBge3IsIHJlc3VsdHM9J2FzaXMnfSAtLT4KPCEtLSByZXBvcnQ6OmNpdGVfcGFja2FnZXMoc2Vzc2lvbiA9IHNlc3Npb25JbmZvKCkpIC0tPgo8IS0tIGBgYCAtLT4KCgo8IS0tIC0tLSAtLT4KCmBgYHtyfQpzZXNzaW9uSW5mbygpCmBgYAoKLS0tCgoKIyDEsGxldGnFn2ltICAKCkNvbXBsZXRlZCBvbiBgciBTeXMudGltZSgpYC4gIAoKU2VyZGFyIEJhbGNpLCBNRCwgUGF0aG9sb2dpc3QgIApkcnNlcmRhcmJhbGNpQGdtYWlsLmNvbSAgCgpodHRwczovL3JwdWJzLmNvbS9zYmFsY2kvQ1YgICAKaHR0cHM6Ly9zYmFsY2kuZ2l0aHViLmlvLyAgCmh0dHBzOi8vZ2l0aHViLmNvbS9zYmFsY2kgIApodHRwczovL3R3aXR0ZXIuY29tL3NlcmRhcmJhbGNpCgotLS0KCmBgYHtyfQpDb21taXRNZXNzYWdlIDwtIHBhc3RlKCJ1cGRhdGVkIG9uICIsIFN5cy50aW1lKCksIHNlcCA9ICIiKQoKd2QgPC0gZ2V0d2QoKQoKZ2l0Q29tbWFuZCA8LSBwYXN0ZSgiY2QgIiwgd2QsICIgXG4gZ2l0IGFkZCAuIFxuIGdpdCBjb21taXQgLS1tZXNzYWdlICciLCBDb21taXRNZXNzYWdlLCAiJyBcbiBnaXQgcHVzaCBvcmlnaW4gbWFzdGVyIFxuIiwgc2VwID0gIiIpCgpzeXN0ZW0oY29tbWFuZCA9IGdpdENvbW1hbmQsIGludGVybiA9IFRSVUUKKQoKYGBgCgoKCgoKCgoK